module.exports = () => {
    // 返回一个中间件函数
    return async (ctx, next) => {
        // 需要校验的请求
        if (ctx.path !== "/login" && ctx.path !== "/register") {
            // 从请求头中，取出 token 信息
            const token = ctx.headers.token;
            // 如果不存在，那就不往下执行，直接返回无法访问
            if (!token) {
                ctx.body = {
                    code: 401,
                    message: "无法校验身份，禁止访问",
                };
                return;
            }

            // 走到这里，说明有 token
            try {
                // 校验 token
                const user = ctx.helper.checkToken(token);

                // 挂载这个解析后的 user 对象，为了下面能够使用到
                ctx.user = user;

                // 解析失败，会报错，下面就捕获到这些错误
                // 根据错误类型不同，返回不同的信息
            } catch (error) {
                // token 过期
                if (error.name === "TokenExpiredError") {
                    ctx.body = {
                        code: 401,
                        message: "token 已过期",
                    };
                    return;
                }

                // token 被篡改
                if (error.name === "JsonWebTokenError") {
                    ctx.body = {
                        code: 401,
                        message: "token 被动了手脚",
                    };
                    return;
                }

                ctx.body = {
                    code: 401,
                    message: "token 解析失败",
                };
                return;
            }
        }

        // 直接向下走
        await next();
    };
};

// 不能直接导出
// module.exports = async (ctx, next) => {

// }
